package com.easymin.weixin.aop;

//import javax.servlet.http.HttpServletRequest;
//
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.time.StopWatch;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.web.client.RestTemplate;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//import com.easymin.weixin.common.IpHelper;
//import com.fasterxml.jackson.databind.JsonNode;
//import com.fasterxml.jackson.databind.ObjectMapper;
//
//@Aspect
//@Component
//public class BlockIPAop{
//	
//	@Autowired
//    private RestTemplate restTemplate;
//
//    
//    @Pointcut("execution(public * com.easymin.weixin.common.api.DaijiaApi.sendVcode(..))")
//    public void pointCutSmsApiSend() {
//        
//    }
//    
//    @Pointcut("execution(public * com.easymin.weixin.common.api.DaijiaApi.sendVcodeUp(..))")
//    public void pointCutSmsApiSendUp() {
//        
//    }
//    
//    
//    @Around("pointCutSmsApiSend()")
//    public Object SmsApiSend(ProceedingJoinPoint thisJoinPoint) throws Throwable {
//
//      HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//      
//      String ip = request.getRemoteAddr();
//      
//      if(checkIp(ip)){
//        return "{'success':true}";
//      }
//      
//      Object args[] = thisJoinPoint.getArgs();
//      
//      StopWatch stopWatch = new StopWatch();
//      stopWatch.start();
//      Object result = thisJoinPoint.proceed(args);
//      stopWatch.stop();
//      return result;
//      
//    }
//    
//    @Around("pointCutSmsApiSendUp()")
//    public Object SmsApiSendUp(ProceedingJoinPoint thisJoinPoint) throws Throwable {
//
//      HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//      
//      String ip = request.getHeader("X-Real-IP");
////      String ip = IpHelper.getIp(request);
//      
//      System.out.println("X-Real-IP:"+request.getHeader("X-Real-IP"));
//      System.out.println("HTTP_X_REAL_IP:"+request.getHeader("HTTP_X_REAL_IP"));
//      System.out.println("X-Forwarded-For:"+request.getHeader("X-Forwarded-For"));
//      System.out.println("request.getRemoteAddr():"+request.getRemoteAddr());
//      System.out.println("==================================");
//      
//      if(checkIp(ip)){
//        return "{'success':true}";
//      }
//      
//      Object args[] = thisJoinPoint.getArgs();
//      
//      StopWatch stopWatch = new StopWatch();
//      stopWatch.start();
//      Object result = thisJoinPoint.proceed(args);
//      stopWatch.stop();
//      return result;
//      
//    }
//    
//    private String getIP(HttpServletRequest request){
//      
//      String ip = request.getHeader("X-Real-IP");
//      
//      if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
//  
//        ip = request.getHeader("X-Forwarded-For");
//  
//        if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
//          return request.getRemoteAddr();
//        } else {
//          // 多次反向代理后会有多个IP值，第一个为真实IP。
//          int index = ip.indexOf(',');
//  
//          if (index != -1) {
//            return ip.substring(0, index);
//          } else {
//            return ip;
//          }
//        }
//        
//      }
//      
//      return ip;
//    }
//    
//    private boolean checkIp(String ip)throws Exception{
//        
//        boolean blocked=true;
//      
//        if(StringUtils.isBlank(ip)){
//            return blocked;
//        }
//        
//        String url = "http://blocks.xiaoka.me/api/block";
//  
//        StringBuilder sb = new StringBuilder();
//        sb.append(url);
//        sb.append("?ip=").append(ip);
//        
//        try {
//          String str = restTemplate.getForObject(sb.toString(), String.class);
//
//          ObjectMapper objectMapper = new ObjectMapper();
//
//          JsonNode jsonNode = objectMapper.readTree(str);
//          int code = jsonNode.get("code").asInt();
//          if (code == 0) {
//              blocked = jsonNode.get("blocked").asBoolean();
//          }
//        } catch (Exception e) {
//          blocked = false;
//          e.printStackTrace();
//        }
//        
//        return blocked;
//    }
//    
// }